完成了這30天的試煉,回頭看這整個過程,我不只學會了技術細節,更養成了面對真實問題時分析與解決的習慣。
一開始的目標很簡單:用純 Java 嘗試掃描指定的 IP 與 port,並把結果整理成好讀的報表。從最基本的 if/for、函式、類別與例外處理起步,我慢慢把焦點轉到網路 I/O 與 Socket 的使用。實作第一個 connect scan 時,我才真正理解 TCP 三次握手、RST 回應與超時的意義——這些在課本中抽象的概念,藉由封包的來回變得具體且深刻。
當程式能逐一檢查 port 時,下一個問題是速度與穩定性。單線程掃描太慢,於是我學會用 ExecutorService 與 ThreadPoolExecutor 做併發控制;當併發任務一多,系統資源(像是 open file descriptors)會成為瓶頸,這促使我採用有界佇列與拒絕策略,並在任務間設計速率限制。這些工程取捨教會我,寫出能跑得快的程式,和寫出能在各種環境下仍穩定運作的程式,其核心關注點並不相同。
在資料收集與同步的部分,我碰到過結果寫入衝突與 race condition 的問題。把全局結構換成 ConcurrentHashMap、ConcurrentLinkedQueue 等 thread-safe 結構後,問題迎刃而解。為了讓掃描結果更容易分享與分析,我學會把資料序列化成 JSON,也把重要資訊渲染成簡潔的 HTML 報表——數據與視覺化的結合,讓技術成果更具說服力。
在學習與實作過程中,我也善用一些線上工具與資源來加快理解與練習步伐。除了使用 Wireshark 與 Nmap 進行封包分析與結果比對外,我也以互動式方式向程式練習工具請教實作細節與錯誤排查(例如:如何設定 socket timeout、如何設計有界的 ThreadPool)。這些工具並非替代我的思考,而是作為輔助,幫我更快驗證想法並形成可靠的實作範式。
專案中最有趣也最實務的部分,是與 Wireshark 與 Nmap 的對照實驗。用 Wireshark 抓封包,可以在時間軸上看到三次握手、RST 或 ICMP unreachable 的細節;用 Nmap 做基準比較,則讓我理解不同掃描策略(如 SYN scan 與 Connect scan)在行為與結果上的差異。這些工具不只幫我驗證程式,也拓展了我對網路層級互動的直觀理解。
過去 30 天並非一路順遂,雖然都是用AI幫助我學習,但也要會問問題。我遇到過大量 timeout、封包被靜默丟棄、以及在高併發下主機資源枯竭的情況。每一次失敗都是學習的機會——我學會在報表中記錄測試環境、調整 timeout 與重試次數、以及分批掃描來降低瞬間壓力。透過不斷測試、觀察與優化,我的工具逐漸從「能用」變成「穩定且可控」,藉由這30天的循序漸進,我對Java越來越熟悉,有達成一開始的目標。之後有機會還是會繼續這樣上傳文章,可以督促自己學習,也是一種動力!